home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 16
/
Aminet 16 (1996)(GTI - Schatztruhe)[!][Dec 1996].iso
/
Aminet
/
comm
/
term
/
term_source.lha
/
Extras
/
Source
/
term-source.lha
/
FixPath.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-10-20
|
3KB
|
137 lines
/*
** FixPath.c
**
** Fix the current Process search patch list by faking a CLI
**
** Copyright © 1990-1996 by Olaf `Olsen' Barthel
** All Rights Reserved
**
** :ts=4
*/
#ifndef _GLOBAL_H
#include "Global.h"
#endif
/* This is how a linked list of directory search paths looks like. */
struct Path
{
BPTR path_Next; /* Pointer to next entry */
BPTR path_Lock; /* The drawer in question; may be NULL */
};
/* ClonePath(BPTR StartPath):
*
* Make a copy of the command search path attached to a
* CLI process.
*/
STATIC BPTR
ClonePath(BPTR StartPath)
{
struct Path *First,*Last,*List,*New;
for(List = BADDR(StartPath), First = Last = NULL ; List ; List = BADDR(List->path_Next))
{
if(List->path_Lock)
{
if(New = AllocVec(sizeof(struct Path),MEMF_ANY))
{
if(New->path_Lock = DupLock(List->path_Lock))
{
New->path_Next = NULL;
if(Last)
Last->path_Next = MKBADDR(New);
if(!First)
First = New;
Last = New;
}
else
{
FreeVec(New);
break;
}
}
else
break;
}
}
return(MKBADDR(First));
}
/* AttachCLI(struct WBStartup *Startup):
*
* Attach a valid CLI structure to the current process. Requires a
* Workbench startup message whose command search path it will
* duplicate.
*/
VOID
AttachCLI(struct WBStartup *Startup)
{
struct CommandLineInterface *DestCLI;
/* Note: FreeDosObject can't free it, but the DOS */
/* process termination code can. */
if(DestCLI = AllocDosObject(DOS_CLI,NULL))
{
struct MsgPort *ReplyPort;
struct Process *Dest;
DestCLI->cli_DefaultStack = 4096 / sizeof(ULONG);
Dest = (struct Process *)FindTask(NULL);
Dest->pr_CLI = MKBADDR(DestCLI);
Dest->pr_Flags |= PRF_FREECLI; /* Mark for cleanup */
Forbid();
ReplyPort = Startup->sm_Message.mn_ReplyPort;
/* Does the reply port data point somewhere sensible? */
if(ReplyPort && (ReplyPort->mp_Flags & PF_ACTION) == PA_SIGNAL && TypeOfMem(ReplyPort->mp_SigTask))
{
struct Process *Father;
/* Get the address of the process that sent the startup message */
Father = (struct Process *)ReplyPort->mp_SigTask;
/* Just to be on the safe side... */
if(Father->pr_Task.tc_Node.ln_Type == NT_PROCESS)
{
struct CommandLineInterface *SourceCLI;
/* Is there a CLI attached? */
if(SourceCLI = BADDR(Father->pr_CLI))
{
STRPTR Prompt;
/* Clone the other CLI data. */
if(Prompt = (STRPTR)BADDR(SourceCLI->cli_Prompt))
SetPrompt(&Prompt[1]);
if(SourceCLI->cli_DefaultStack > DestCLI->cli_DefaultStack)
DestCLI->cli_DefaultStack = SourceCLI->cli_DefaultStack;
if(SourceCLI->cli_CommandDir)
DestCLI->cli_CommandDir = ClonePath(SourceCLI->cli_CommandDir);
}
}
}
Permit();
}
}